/*
 * listas.c
 *
 *  Created on: 15/09/2011
 *      Author: Ciro Martín
 */

#include <stdio.h>
#include <stdlib.h>

typedef struct nodoLista
{
	int peticion;
	struct nodoLista *ptrSgte;
}nodoLista_t;

typedef nodoLista_t *ptrNodoLista;

/*Prototipo de las funciones no se como hacer mi propia biblioteca asi que tengo que copiar siempre estas funciones en otros programas juajua*/
void insertarNodo (ptrNodoLista *lista, int Pet);
int suprimirNodo (ptrNodoLista *Lista, int Pet);
int estaVacia (ptrNodoLista Lista);
void mostrarLista (ptrNodoLista Lista);
void titulo(void);

/* int main()
{
   ptrNodoLista ptrInicial = NULL;
   int eleccion;
   int elemento;

   titulo();
   printf( "? " );
   scanf( "%d", &eleccion );


   while ( eleccion != 3 ) {

      switch ( eleccion ) {

         case 1:
            printf( "Introduzca un caracter: " );
            scanf( "\n%d", &elemento );
            insertarNodo( &ptrInicial, elemento );
            mostrarLista( ptrInicial );
            break;

         case 2:


            if ( !estaVacia( ptrInicial ) ) {
               printf( "Introduzca un caracter para eliminar: " );
               scanf( "\n%d", &elemento );


               if ( suprimirNodo( &ptrInicial, elemento ) ) {
                  printf( "caracter %d eliminado.\n", elemento );
                  mostrarLista( ptrInicial );
               }
               else {
                  printf( "no se encuentra el caracter %d.\n\n", elemento );
               }

            }
            else {
               printf( "La lista esta vacia.\n\n" );
            }

            break;

         default:
            printf( "Opcion invalida.\n\n" );
            titulo();
            break;

      }

      printf( "? " );
      scanf( "%d", &eleccion );
   }

   printf( "Fin del programa.\n" );

   return 0;

}*/

void titulo(void){
	printf("¿Que queres hacer?\n"
		"1 : Para insertar un nodo\n"
		"2 : Para eliminar  un nodo\n"
		"3 : Para salir del programa \n");

}

void insertarNodo (ptrNodoLista *Lista, int Pet)
{
	ptrNodoLista ptrNuevo;
	ptrNodoLista ptr;
	ptrNodoLista ptrActual;
	ptrNuevo = malloc(sizeof(nodoLista_t));
		if(ptrNuevo != NULL){    //significa que se pudo reservar la memoria

		ptrActual = *Lista;
			if((ptrActual == NULL) || (Pet < ptrActual->peticion)){
				ptrNuevo->peticion = Pet;
				ptrNuevo->ptrSgte = *Lista;
				*Lista=ptrNuevo;
			}
			else{
				ptrNuevo->peticion = Pet;
				ptr=*Lista;
				while((ptr->ptrSgte != NULL)&&(Pet > (ptr->ptrSgte)->peticion)){
					ptr = ptr->ptrSgte;
				}
				ptrNuevo->ptrSgte = ptr->ptrSgte;
				ptr->ptrSgte = ptrNuevo;
			}
		}//fin del if de si se reservo memoria
		else{
			printf("no se tienes memoria suficiente");
		}
}



int suprimirNodo (ptrNodoLista *Lista, int Pet){
	ptrNodoLista ptr;
	ptrNodoLista ptrAnt;

	if ((*Lista)->peticion == Pet){
		ptr=*Lista;
		*Lista=(*Lista)->ptrSgte;
		free(ptr);
		return Pet;
	}
	else{
		ptrAnt=(*Lista);
		ptr=(*Lista)->ptrSgte;
		while(ptr!=NULL && ptr->peticion != Pet){
			ptrAnt=ptr;
			ptr=ptr->ptrSgte;
		}
		if(ptr!=NULL){
			ptrAnt->ptrSgte=ptr->ptrSgte;
			free(ptr);
			return Pet;
		}
	}
	return 0;
}


int estaVacia (ptrNodoLista Lista){
	if(Lista == NULL){ // si la lista esta vacia
		return 1;   //returna verdadero
	}
	else{
		return 0;   // returna falso
	}
}



void mostrarLista (ptrNodoLista Lista){
	ptrNodoLista ptr;
	ptr=Lista;
	if (ptr == NULL){
		printf("La lista esta vacia.\n\n");
	}
	else{
		printf("La lista es: \n");
		while(ptr !=NULL){
			printf("%d --> ", ptr->peticion);
			ptr=ptr->ptrSgte;
		}
		printf("NULL\n\n");
	}
}
